package com.ruoyi.framework.config;

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.cipher.RSASigner;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.util.PemUtil;
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
import com.wechat.pay.java.service.payments.nativepay.NativePayService;
import com.wechat.pay.java.service.refund.RefundService;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.security.PrivateKey;

@Data
@Configuration
@ConfigurationProperties(prefix = "wechat")
public class WxPayConfig {

    /** 商户号 */
    private String mchId;

    /** 商户私钥路径 */
    private String privateKeyPath;

    /** 商户证书序列号 */
    private String mchSerialNo;

    /** APIv3密钥 */
    private String apiV3Key;

    /** 通知地址 */
    private String notifyUrl;

    /** 通知地址 */
    private String refundNotifyUrl;

    /** 商户端通知地址 */
    private String merchantNotifyUrl;

    /**
     * 从PEM字符串加载私钥
     */
    private PrivateKey loadPrivateKey() {
        try {
            return PemUtil.loadPrivateKeyFromPath(privateKeyPath);
        } catch (Exception e) {
            throw new RuntimeException("加载私钥失败", e);
        }
    }

    @Bean
    public RSASigner rsaSigner() {
        return new RSASigner(mchId, loadPrivateKey());
    }

    /**
     * 配置自动更新平台证书的RSA配置
     */
    @Bean
    public Config wechatPayConfig() {
        return new RSAAutoCertificateConfig.Builder()
                .merchantId(mchId)
                .privateKeyFromPath(privateKeyPath)
                .merchantSerialNumber(mchSerialNo)
                .apiV3Key(apiV3Key)
                .build();
    }

    /**
     * JSAPI支付服务
     */
    @Bean
    public JsapiService jsapiService(Config config) {
        return new JsapiService.Builder().config(config).build();
    }

    /**
     * Native支付服务
     */
    @Bean
    public NativePayService nativeService(Config config) {
        return new NativePayService.Builder().config(config).build();
    }

    /**
     * 退款服务
     */
    @Bean
    public RefundService refundService(Config config) {
        return new RefundService.Builder().config(config).build();
    }

    /**
     * 创建通知解析器
     */
    @Bean
    public NotificationParser notificationParser(Config config) {
        return new NotificationParser((NotificationConfig) config);
    }
}
